//!! 189题 
//!! 给定一个整数数组 nums，将数组中的元素向右轮转 k 个位置，其中 k 是非负数。
 

//! 示例 1:

//! 输入: nums = [1,2,3,4,5,6,7], k = 3
//! 输出: [5,6,7,1,2,3,4]
//! 解释:
//! 向右轮转 1 步: [7,1,2,3,4,5,6]
//! 向右轮转 2 步: [6,7,1,2,3,4,5]
//! 向右轮转 3 步: [5,6,7,1,2,3,4]

//! 示例 2:

//! 输入：nums = [-1,-100,3,99], k = 2
//! 输出：[3,99,-1,-100]
//! 解释: 
//! 向右轮转 1 步: [99,-1,-100,3]
//! 向右轮转 2 步: [3,99,-1,-100]
//! 

struct Solution;

impl Solution {

    /// 方法1， 使用临时变量来存储转动的部分，然后把不转动的再移动到临时变量，最后原样拷贝到目标数组
    fn rotate(nums: &mut Vec<i32>, k: i32) {
        let mut tmp_k = k as usize;
        let nums_len = nums.len();
        if tmp_k<1 {
            return;
        }
        if tmp_k>nums_len {
            tmp_k = tmp_k%nums_len;
        }

        // 创建一个临时变量，来存储转动的部分
        let mut tmp_nums = Vec::<i32>::with_capacity(nums.len());
        for i in 0..tmp_k {
            tmp_nums.push(nums[nums_len-tmp_k +i]);
        }
        // 拷贝不转动的给临时i变量
        for i in 0..(nums_len-tmp_k) {
            tmp_nums.push(nums[i ]);
        }
        for i in 0..nums_len {
            nums[i] = tmp_nums[i];
        }
      
    }

    /// 方法2， 语言内置的功能
    fn rotate2(nums: &mut Vec<i32>, k: i32) {
        nums.rotate_right(k  as usize);
    }

    /// 方法3， 使用vec的reverse方法，通过两次逆向
    fn rotate3(nums: &mut Vec<i32>, k: i32) {
        let mut k = k as usize;
        let nums_len = nums.len();
        if k<1 {
            return;
        }
        if k>nums_len{
            k = k%nums_len;
        }
        let k = nums_len-k;
        nums[..k].reverse();
        nums[k..].reverse();
        nums.reverse();
    }
}

#[cfg(test)]
mod test {

    use super::*;

    #[test]
    fn test() {
        let mut nums = vec![1,2,3,4,5,6,7];
        Solution::rotate(&mut nums, 3);
        println!("{nums:?}")
    }

    #[test]
    fn test2() {
        let mut nums = vec![1,2,3,4,5,6,7];
        Solution::rotate2(&mut nums, 3);
        println!("{nums:?}")
    }

    #[test]
    fn test3() {
        let mut nums = vec![1,2,3,4,5,6,7];
        Solution::rotate3(&mut nums, 3);
        println!("{nums:?}")
    }
}